package com.atguigu.a_principle.p3inversion.v2;

/**
 * 依赖倒转原则：抽象不应该依赖细节，细节应该依赖抽象
 *
 * 1. 高层模块不应该依赖低层模块，二者都应该依赖其抽象
 * 2. 抽象不应该依赖细节，细节应该依赖抽象
 * 3. 依赖倒转(倒置)的中心思想是面向接口编程
 * 4. 依赖倒转原则是基于这样的设计理念：相对于细节的多变性，抽象的东西要稳定的多。
 * 以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在 java 中，抽象指的是接口或抽象类，细节就是具体的实现类
 * 5.使用接口或抽象类的目的是制定好规范，而不涉及任何具体的操作，把展现细节的任务交给他们的实现类去完
 * 成
 */
public class DependenceInversion {
/**
 * 1。低层模块尽量都要有抽象类或接口，或者两者都有，程序稳定性更好.
 * 2。变量的声明类型尽量是抽象类或接口, 这样我们的变量引用和实际对象间，就存在一个缓冲层，利于程序扩展和优化
 * 3。继承时遵循里氏替换原则
 */
    public static void main(String[] args) {
        Person person = new Person();
        person.receive(new Email());
        person.receive(new Weixin());
    }
}
/**
方式 1 分析
1. 简单，比较容易想到
2. 如果我们获取的对象是 微信，短信等等，则新增类，同时 Perons 也要增加相应的接收方法
3. 解决思路：引入一个抽象的接口 IReceiver, 表示接收者, 这样 Person 类与接口 IReceiver 发生依赖
 因为 Email, WeiXin 等等属于接收的范围，他们各自实现 IReceiver 接口就 ok, 这样我们就符号依赖倒转原则
*/
class Person {
    public void receive(IReceiver receiver){
        System.out.println("收到消息："+receiver.getContent());
    }

   
}

interface IReceiver {
    public String getContent();
}

class Email implements IReceiver{

    @Override
    public String getContent() {
        return "hello email...";
    }
}

class Weixin implements IReceiver{

    @Override
    public String getContent() {
        return "hello weixin...";
    }
}

